﻿Imports FairShop.Operaties

Public Class VoorraadBewegingenForm

    Private _mainForm As Form

#Region "Public property's"

    Private _kanVerwijderen As Boolean
    Public Property KanVerwijderen() As Boolean
        Get
            Return _kanVerwijderen
        End Get
        Set(ByVal value As Boolean)
            _kanVerwijderen = value
            tsbVerwijderen.Enabled = value
            BindingNavigatorDeleteItem.Enabled = value
        End Set
    End Property

    Private _kanBewaren As Boolean
    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
        End Set
    End Property

#End Region

#Region "Constructors"

    ''' <summary>
    ''' Constructor
    ''' </summary>
    ''' <param name="mainForm">Indien opgestart vanuit MainForm, anders is dit Nothing</param>
    Public Sub New(ByVal mainForm As Form)
        InitForm()
        _mainForm = mainForm
    End Sub

    Private Sub InitForm()
        InitializeComponent()

        Me.VoorraadBewegingenBindingSource.DataSource = Utility.Data
        Me.ArtikelsBindingSource.DataSource = Utility.Data

        Me.BindingNavigatorAddNewItem.Visible = False
        Me.BindingNavigator1.AddNewItem = Nothing
        Me.BindingNavigator1.DeleteItem = Nothing
        KanBewaren = False
        KanVerwijderen = False
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Try
            InitGrid()
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("VoorraadBewegingenForm_Load", ex)
        End Try
    End Sub

#End Region

#Region "Event handling"

    Private Sub tsbAfsluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbAfsluiten.Click
        Me.Close()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                Me.Close()
            Case Keys.F2
                If (Not KanBewaren) Then Return
                BewaarWijzigingen()
            Case Keys.F3
                If (Not KanVerwijderen) Then Return
                Verwijderen()
        End Select
    End Sub

    Private Sub InvoerArtikelsControl1_BarcodeConfirmed(ByVal sender As Object, ByVal e As InvoerArtikelsControl.BarcodeConfirmedEventArgs) _
            Handles InvoerArtikelsControl1.BarcodeConfirmed
        Try
            Dim eersteArtikelMetDezeBarcode As ArtikelsDataSet.ArtikelsRow = ArtikelsBL.GetEersteVerkoopbaarArtikelMetBarcode(InvoerArtikelsControl1.Barcode)

            If (eersteArtikelMetDezeBarcode Is Nothing) Then
                ' barcode niet gevonden in artikeltabel, doe logging
                Dal.OnbekendeBarcodeToevoegen(InvoerArtikelsControl1.Barcode)
                ' generiek artikel nemen WOBTW0, WOBTW6 of WOBTW21
                ' Voorlopig alleen loggen hier. De gebruiker zal het wel zien
                ' en moet dan zelf maar een generieke barcode inscannen.
            Else
                ' barcode gevonden in de databank
                Utility.Data.Voorraadbewegingen.AddVoorraadbewegingenRow(eersteArtikelMetDezeBarcode, DateTime.Now(), _
                    InvoerArtikelsControl1.Aantal, "", eersteArtikelMetDezeBarcode.Omschrijving, eersteArtikelMetDezeBarcode.Inkoopprijs)

                e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Valid

                ' zorg ervoor dat de eerste rij geselecteerd is en in beeld
                VoorraadBewegingenBindingSource.Position = 0
                KanBewaren = True

                Sound.PlayOK()
            End If
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("InvoerArtikelsControl1_BarcodeConfirmed", ex)
            e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Invalid
        End Try
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbBewaren.Click
        BewaarWijzigingen()
    End Sub

    Private Sub Grid1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs) Handles Grid1.RowValidating
        Dim cell As DataGridViewCell = Grid1.Rows(e.RowIndex).Cells(5)
        If (cell.Value Is Nothing OrElse cell.Value.ToString() = "") Then
            e.Cancel = True
            Grid1.Rows(e.RowIndex).ErrorText = "De reden moet ingevuld worden"
        Else
            Grid1.Rows(e.RowIndex).ErrorText = ""
        End If
    End Sub

    Private Sub Grid1_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles Grid1.CellValueChanged
        KanBewaren = True
    End Sub

    Private Sub Grid1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Grid1.SelectionChanged
        If (Grid1.SelectedRows.Count = 0) Then
            KanVerwijderen = False
            Return
        Else
            Dim selectedRow As DataGridViewRow = Grid1.SelectedRows(0)
            If (selectedRow.DataBoundItem Is Nothing) Then Return
            Dim drv As DataRowView = DirectCast(selectedRow.DataBoundItem, DataRowView)
            If (drv Is Nothing) Then Return
            Dim dataRow As ArtikelsDataSet.VoorraadbewegingenRow = DirectCast(drv.Row, ArtikelsDataSet.VoorraadbewegingenRow)
            Dim originalState As DataRowState = dataRow.RowState
            If (originalState = DataRowState.Added) Then
                ' alleen toegevoegde rijen kunnen verwijderd worden, bestaande rijen niet
                ' tip: de gebruiker kan wel bij bestaande rijen het aantal op 0 zetten
                KanVerwijderen = True
            End If
        End If
    End Sub

    Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs)
        MyBase.OnFormClosing(e)
        If (Utility.HasChanges(Utility.Data.Voorraadbewegingen)) Then
            Dim result As DialogResult = MessageBox.Show("Deze voorraadbewegingen bevatten wijzigingen. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case DialogResult.Yes
                    If (BewaarWijzigingen() = 0) Then
                        e.Cancel = True
                        Return
                    End If
                Case DialogResult.Cancel
                    e.Cancel = True
                    Return
                Case DialogResult.No
                    Utility.Data.Voorraadbewegingen.RejectChanges()
            End Select
        End If
        If (_mainForm IsNot Nothing) Then _mainForm.BringToFront()
    End Sub

    Private Sub Grid1_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles Grid1.DataError
        MsgBox.ShowError("Ongeldige invoer. Bij een wijziging, druk Esc om de vorige waarde te herstellen")
        log.WriteError("VoorraadBewegingenForm.Grid1_DataError", e.Exception)
        e.Cancel = True
    End Sub

    Private Sub tsbVerwijderen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbVerwijderen.Click
        Verwijderen()
    End Sub

    Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorDeleteItem.Click
        Verwijderen()
    End Sub

    Private Sub Grid1_CellToolTipTextNeeded(ByVal sender As Object, ByVal e As DataGridViewCellToolTipTextNeededEventArgs) Handles Grid1.CellToolTipTextNeeded
        Dim aantalColumn As DataGridViewColumn = DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.AantalColumn.ColumnName, Grid1)
        If (aantalColumn IsNot Nothing AndAlso e.ColumnIndex = aantalColumn.Index) Then
            e.ToolTipText = "Aantal artikels dat UIT voorraad gegaan is. Gebruik alleen een minteken als het artikel binnengekomen is."
        End If
    End Sub

#End Region

#Region "Helperfuncties"

    Private Sub InitGrid()
        With Grid1
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.IdColumn.ColumnName, Grid1)
                .Visible = False ' Autonumber niet tonen
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.IdArtikelColumn.ColumnName, Grid1)
                .Visible = False ' Id van het artikel niet tonen
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.ArtikelColumn.ColumnName, Grid1)
                .Width = 300
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.DatumColumn.ColumnName, Grid1)
                .Width = 150
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.AantalColumn.ColumnName, Grid1)
                .Width = 80
                .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                .ToolTipText = "Aantal dat uit voorraad gaat. Indien negatief, dan gaat het naar de voorraad"
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Voorraadbewegingen.RedenColumn.ColumnName, Grid1)
                .Width = 150
                Me.RedenDataGridViewComboBoxColumn.Items.Clear()
                Me.RedenDataGridViewComboBoxColumn.Items.AddRange(Constants.VOORRAADBEWEGING_REDENEN)
                .ToolTipText = "Kies een reden voor de voorraadbeweging. Alleen de redenen in de lijst zijn toegelaten."
            End With
        End With
    End Sub

    Private Function BewaarWijzigingen() As Integer
        'Me.InvoerArtikelsControl1.Clear()
        'Dim aantal As Integer = MyBase.Bewaar(Utility.Data.Voorraadbewegingen, "voorraadbeweging(en)", KanBewaren)
        'If (aantal = 0) Then
        '    MsgBox.ShowError("De gegevens zijn niet goed ingevuld. Het bewaren is geannuleerd. Verbeter de gegevens en probeer opnieuw")
        'End If
        'Return aantal
        If (Not Me.ValidateChildren()) Then
            MsgBox.ShowError("De gegevens zijn niet goed ingevuld. Het bewaren is geannuleerd. Verbeter de gegevens en probeer opnieuw")
            Return 0
        End If
        Try
            Cursor = Cursors.WaitCursor
            Grid1.EndEdit()

            ' bewaar de bewegingen en pas de verwachte voorraad aan in de Artikels-tabel

            Dim aantalToegevoegd As Integer = 0
            Dim aantalVerwijderd As Integer = 0
            Dim aantalGewijzigd As Integer = 0

            For i As Integer = Utility.Data.Voorraadbewegingen.Count - 1 To 0 Step -1
                ' achterstevoren omdat aantal bewegingen kan veranderen tijdens de lus,
                Dim row As ArtikelsDataSet.VoorraadbewegingenRow = Utility.Data.Voorraadbewegingen(i)
                Select Case row.RowState
                    Case DataRowState.Added
                        aantalToegevoegd += 1
                        Dal.VoorraadBewegingToevoegen(row) ' past de verwachte voorraad aan
                    Case DataRowState.Deleted
                        ' Voorlopig laat de grid dit niet toe
                        ' TODO: dit zou ook de voorraad moeten bijwerken
                        aantalVerwijderd += 1
                    Case DataRowState.Modified
                        Dal.VoorraadBewegingBijwerken(row)
                        aantalGewijzigd += 1
                End Select
            Next
            Dim voorraadbewegingenTableAdapter As New ArtikelsDataSetTableAdapters.VoorraadbewegingenTableAdapter
            Dim aantal As Integer = voorraadbewegingenTableAdapter.Update(Utility.Data.Voorraadbewegingen)
            Dim msg As String = String.Format("{0} voorraadbeweging(en) werd(en) bijgewerkt.{1}{2} voorraadbeweging(en) werd(en) toegevoegd.{3}{4} voorraadbeweging(en) werd(en) verwijderd.", _
                aantalGewijzigd, Environment.NewLine, aantalToegevoegd, Environment.NewLine, aantalVerwijderd)
            MessageBox.Show(msg, "Bewaren", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Me.InvoerArtikelsControl1.Clear()
            KanBewaren = False
            Return aantal + aantalToegevoegd
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het bewaren")
            log.WriteError("VoorraadBewegingenForm.BewaarWijzigingen", ex)
        Finally
            Cursor = Cursors.Default
        End Try
        Return 0
    End Function

    Private Sub Verwijderen()
        Try
            Cursor = Cursors.WaitCursor
            For i As Integer = Grid1.SelectedRows.Count - 1 To 0 Step -1 ' achterstevoren omdat we rijen kunnen verwijderen
                Dim selectedRow As DataGridViewRow = Grid1.SelectedRows(i)
                If (selectedRow.DataBoundItem Is Nothing) Then Continue For
                Dim drv As DataRowView = DirectCast(selectedRow.DataBoundItem, DataRowView)
                If (drv Is Nothing) Then Continue For
                Dim dataRow As ArtikelsDataSet.VoorraadbewegingenRow = DirectCast(drv.Row, ArtikelsDataSet.VoorraadbewegingenRow)
                Dim originalState As DataRowState = dataRow.RowState
                If (originalState = DataRowState.Added) Then
                    Grid1.Rows.Remove(selectedRow)
                Else
                    ' Deze voorraadbeweging bestond al. 
                    ' NIETS DOEN
                End If
            Next
            KanBewaren = Utility.HasChanges(Utility.Data.Voorraadbewegingen)
        Catch ex As Exception
            log.WriteError("VoorraadBewegingenForm.Verwijderen", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

#End Region

End Class